﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using RegraNegocio;
using Util;

namespace ControleDePedidos
{
    public partial class Pedido : Form
    {
        private static int CADASTRAR = 0;
        private static int CONSULTAR = 1;
        private Model.Pedido pedido = null;
        private List<ItemPedidoVO> produtosSelecionados = new List<ItemPedidoVO>();

        public Pedido()
        {
            InitializeComponent();

            this.populaComboBoxCliente();
            this.populaComboBoxProduto();

            this.cmbAcao.SelectedIndex = 0;
            this.dtgProdutos.AutoGenerateColumns = false;
        }

        private void populaComboBoxCliente() 
        {
            List<Model.Cliente> clientesCadastrados = ClienteBO.getInstance().recuperarTodosClientes();

            cmbCliente.DataSource = clientesCadastrados;
            cmbCliente.ValueMember = "codigo";
            cmbCliente.DisplayMember = "nome";
        }

        private void populaComboBoxProduto()
        {
            List<Model.Produto> produtosCadastrados = ProdutoBO.getInstance().recuperarTodosProdutos();

            cmbProduto.DataSource = produtosCadastrados;
            cmbProduto.ValueMember = "codigo";
            cmbProduto.DisplayMember = "nome";
        }

        private void btnAdicionaProduto_Click(object sender, EventArgs e)
        {
            String quantidade = txtQtde.Text;
            ItemPedidoVO auxiliar = null;

            if (cmbProduto.SelectedIndex <= 0 && quantidade.Equals(string.Empty)) 
            {
                MessageBox.Show("Favor verificar o preenchimento dos campos Produto e Quantidade.", "Atenção");

                return;
            }

            if (FormularioUtil.getInstance().isInteiro(quantidade))
            {
                int codigoProduto = int.Parse(cmbProduto.SelectedValue.ToString());

                if (ProdutoBO.getInstance().verificarRetiradaEstoque(codigoProduto, int.Parse(quantidade)))
                {
                    if (!ItemPedidoBO.getInstance().hasItemPedido(produtosSelecionados, codigoProduto))
                    {
                        auxiliar = new ItemPedidoVO();

                        auxiliar.CodigoProduto = codigoProduto;
                        auxiliar.NomeProduto = cmbProduto.SelectedText;
                        auxiliar.Quantidade = int.Parse(quantidade);

                        produtosSelecionados.Add(auxiliar);

                        dtgProdutos.DataSource = null;
                        dtgProdutos.DataSource = produtosSelecionados;

                        txtQtde.Text = string.Empty;
                    }
                    else 
                    {
                        MessageBox.Show("O item escolhido já foi adicionado a lista!", "Atenção!");
                    }
                }
                else 
                {
                    MessageBox.Show("A quantidade de produtos selecionada é maior que a quantidade que consta em estoque.", "Atenção");
                }
            }
            else
            {
                MessageBox.Show("O campo Quantidade deve ser preenchido com valores numéricos.", "Atenção");
            }
        }

        private void cmbAcao_SelectedIndexChanged(object sender, EventArgs e)
        {
            int acaoSelecionada = cmbAcao.SelectedIndex;

            FormularioUtil.getInstance().limparCampos(this.Controls);

            if (acaoSelecionada == CADASTRAR)
            {
                this.camposHabilitadosCadastrar();

                this.btnSalvar.Text = "Cadastrar";
            }
            else if (acaoSelecionada == CONSULTAR)
            {
                this.camposHabilitadosConsultar();

                this.btnSalvar.Text = "Consultar";
            }
            else
            {
                this.camposHabilitadosConsultar();

                this.btnSalvar.Text = "Excluir";
            }

        }

        private void camposHabilitadosCadastrar() {
            this.lblCodigo.Visible = false;
            this.txtCodigo.Visible = false;

            this.txtDescricao.Enabled = true;
            this.txtData.Enabled = true;
            this.txtDesconto.Enabled = true;
            this.txtOrcamento.Enabled = true;
            this.txtQtde.Enabled = true;
            this.cmbProduto.Enabled = true;
            this.cmbCliente.Enabled = true;

            this.dtgProdutos.Enabled = true;
            this.btnAdicionaProduto.Enabled = true;

            this.lblValorTotal.Visible = false;
            this.lblResultado.Visible = false;
        }

        private void camposHabilitadosConsultar()
        {
            this.lblCodigo.Visible = true;
            this.txtCodigo.Visible = true;

            this.txtDescricao.Enabled = false;
            this.txtData.Enabled = false;
            this.txtDesconto.Enabled = false;
            this.txtOrcamento.Enabled = false;
            this.txtQtde.Enabled = false;
            this.cmbProduto.Enabled = false;
            this.cmbCliente.Enabled = false;

            this.lblValorTotal.Visible = false;
            this.lblResultado.Visible = false;

            this.btnAdicionaProduto.Enabled = false;
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            pedido = new Model.Pedido();
            String acao = btnSalvar.Text;

            if (acao.Equals("Cadastrar")) { 
                Dictionary<String, String> camposValidados = FormularioUtil.getInstance().validarCampos(this.Controls);

                if (camposValidados != null && camposValidados.Count > 0)
                {
                    foreach (var chave in camposValidados)
                    {
                        MessageBox.Show(chave.ToString().Replace(',', ':'), "Atenção");
                    }
                }
                else
                {
                    if (!FormularioUtil.getInstance().isDecimal(txtDesconto.Text)) {
                        MessageBox.Show("O campo desconto deve ser preenchido com números!", "Atenção");

                        return;
                    }

                    if (!FormularioUtil.getInstance().isDate(txtData.Text)) {
                        MessageBox.Show("O campo data deve ser preenchido no formato dd/MM/yyyy!", "Atenção");
                    }

                    if (produtosSelecionados.Any())
                    {
                        pedido.Descricao = txtDescricao.Text;
                        pedido.Data = FormularioUtil.getInstance().convertToDate(txtData.Text);
                        pedido.Orcamento = txtOrcamento.Text;
                        pedido.ValorDesconto = decimal.Parse(txtDesconto.Text);
                        pedido.Cliente = new Model.Cliente(int.Parse(cmbCliente.SelectedValue.ToString()));
                        try
                        {
                            PedidoBO.getInstance().inserirPedido(pedido, ItemPedidoBO.getInstance().convertToItemPedido(produtosSelecionados));

                            MessageBox.Show("Sucesso na inserção do pedido!");

                            FormularioUtil.getInstance().limparCampos(this.Controls);
                        }
                        catch (Exception cause)
                        {
                            MessageBox.Show("Problema na inserção do pedido: " + cause.Message);
                        }
                    }
                    else {
                        MessageBox.Show("É obrigatório o preenchimento de ao menos 1 produto!");
                    }
                }
            }
            else if (acao.Equals("Consultar"))
            {
                if (txtCodigo.Text.Equals(string.Empty) || !FormularioUtil.getInstance().isInteiro(txtCodigo.Text))
                {
                    MessageBox.Show("É necessário o preenchimento do código do pedido!");

                    return;
                }

                try
                {
                    pedido = PedidoBO.getInstance().consultar(new Model.Pedido(int.Parse(txtCodigo.Text)));
                    produtosSelecionados = ItemPedidoBO.getInstance().recuperarProdutosPedido(pedido);

                    this.populaCamposDataGrid(pedido, produtosSelecionados);
                }
                catch (Exception cause)
                {
                    MessageBox.Show("Produto não existe!", "Atenção!");
                    FormularioUtil.getInstance().limparCampos(this.Controls);
                    this.camposHabilitadosConsultar();
                }
            }
            else {
                String codigoPedido = txtCodigo.Text;

                if (codigoPedido.Equals(string.Empty) || !FormularioUtil.getInstance().isInteiro(codigoPedido)) {
                    MessageBox.Show("O campo código deve ser preenchido corretamente!", "Atenção!");

                    return;
                }

                try {
                    PedidoBO.getInstance().deletar(new Model.Pedido(int.Parse(codigoPedido)));

                    MessageBox.Show("Sucesso na exclusão do pedido!", "Sucesso!");

                    FormularioUtil.getInstance().limparCampos(this.Controls);
                }catch(Exception)
                {
                    MessageBox.Show("Pedido não existente");
                }
            
            }

        }

        private void dtgProdutos_DoubleClick(object sender, EventArgs e)
        {
            int linhaSelecionada = dtgProdutos.SelectedRows[0].Index;

            produtosSelecionados.RemoveAt(linhaSelecionada);

            dtgProdutos.DataSource = null;
            dtgProdutos.DataSource = produtosSelecionados;
        }

        private void populaCamposDataGrid(Model.Pedido pedido, List<ItemPedidoVO> items) 
        {
            this.txtDescricao.Text = pedido.Descricao;
            this.txtData.Text = pedido.Data.ToString("dd/MM/yyyy");
            this.txtDesconto.Text = String.Format("{0:0.00}", pedido.ValorDesconto);
            this.txtOrcamento.Text = pedido.Orcamento;
            this.lblResultado.Text = String.Format("R$ {0:0.00}", pedido.ValorTotal);

            this.lblValorTotal.Visible = true;
            this.lblResultado.Visible = true;

            this.cmbCliente.SelectedValue = pedido.Cliente.Codigo;
            this.dtgProdutos.DataSource = items; 
        }

    }
}